Op deze pagina vind je een demonstratie van een statistische techniek aan de hand van een voorbeeld.

Meer informatie over hoe je deze pagina kan gebruiken vind je in deze handleiding.

De analyse gebeurt met behulp van R en RStudio. Een inleiding tot deze software vind je hier.


Referentie

Het voorbeeld op deze pagina is geïnspireerd door een studie van Mell et al. (2021). Om praktische en didactische redenen werden de hypothesen en de data aangepast.



1 Doel

Lineaire regressie is een statistische techniek die je kan gebruiken om een hypothese te toetsen over het effect van een variabele (een onafhankelijke variabele of predictor) op een andere variabele (de afhankelijke variabele of uitkomst). In lineaire regressie is die afhankelijke variabele altijd continu, dus ten minste van intervalniveau.

Dit effect kan zelf ook variëren onder invloed van een andere variabele: in sommige omstandigheden is het effect groter dan in andere omstandigheden. Anders gezegd, het effect van een predictor op een afhankelijke variabele hangt af van de waarde van een derde variabele. In dat geval is er sprake van een interactie-effect.

Onderzoek heeft bijvoorbeeld uitgewezen dat er een effect is van iemands sociaal-economische status op het vertrouwen dat iemand heeft in anderen.

Nu vraag jij je af of dit effect verschillend is naargelang iemands familiale situatie. Je vermoedt met andere woorden dat iemands burgerlijke staat een effect heeft op het verband tussen sociaal-economische status en vertrouwen.

Via een modelvergelijkingstoets kan je toetsen of er een interactie-effect speelt.

Op deze pagina kom je te weten hoe je zo’n toets kan uitvoeren in R. De uitleg op deze pagina gaat over interactie tussen een categorische (meer bepaald een nominale) predictor en een continue predictor.

Zo goed als altijd zal je moeten controleren voor extra predictoren die het resultaat van de toetsing kunnen beïnvloeden.


Let op! De demonstratie hieronder leert je alleen hoe je een hypothese over een interactie-effect kan toetsen. Wil je daarnaast ook conclusies trekken over de hoofdeffecten in hetzelfde model, dan zijn er heel wat extra zaken om rekening mee te houden.1


Interactie-effecten in een lineair regressiemodel worden uitgebreid behandeld in deze cursus vanaf p.61. Er is ook een oefeningenreeks met uitgewerkte antwoorden beschikbaar.



2 De dataset

De dataset dataVertrouwen bevat gegevens van 7 variabelen geobserveerd bij 1217 Belgen.

Deze dataset kan je inladen met read.csv(). De data kan je best meteen in een object dataVertrouwen onderbrengen zodat je die later makkelijk opnieuw kan oproepen.

dataVertrouwen <- read.csv("https://statlas.ugent.be/datasets/vertrouwen.csv")


Met str() krijg je een opsomming van alle variabelen in de dataset. Je vindt er ook telkens bij om welk datatype het gaat. Afhankelijk van het datatype zal je sommige functies wel of juist niet kunnen gebruiken om je data te verkennen. Het heeft bijvoorbeeld geen zin om een gemiddelde te berekenen van een variabele van type chr.

str(dataVertrouwen) 
'data.frame':   1217 obs. of  7 variables:
 $ X         : int  1 2 3 4 5 6 7 8 9 10 ...
 $ vertrouwen: num  2.85 -3.74 -1.74 -2.71 0.22 ...
 $ sesKind   : num  0.296 4.213 0.317 0.296 4.856 ...
 $ sesVolw   : num  -0.27 -2.33 2.48 2.48 1.09 ...
 $ geslacht  : chr  "Man" "Man" "Vrouw" "Vrouw" ...
 $ wrkls     : chr  "Ja" "Ja" "Nee" "Ja" ...
 $ burgst    : chr  "nooit getrouwd" "feitelijk gescheiden" "getrouwd" "getrouwd" ...

In de output van str() zie je inderdaad dat er 7 variabelen zijn met telkens 1217 observaties.

Categorische variabelen die je in je analyse wil gebruiken zet je best meteen om met de functie factor().

dataVertrouwen$burgst <- factor(dataVertrouwen$burgst) 
dataVertrouwen$wrkls <- factor(dataVertrouwen$wrkls) 
dataVertrouwen$geslacht <- factor(dataVertrouwen$geslacht) 



3 Een lineair model met interactie specifiëren in R

Je kan een model bouwen met de functie lm(). Het eerste argument van die functie is een formule waarin je specifieert welke variabelen je in het model wil opnemen:

  1. een afhankelijke variabele
  2. een tilde ~
  3. predictoren gescheiden door een +
  4. predictoren waartussen je een interactie vermoedt gescheiden door een dubbele punt :

In het tweede argument bepaal je uit welk dataframe de variabelen komen. Hier is dat dataVertrouwen.

Zo’n model kan je in een object met een eenvoudige naam stoppen.

modelInteractie <- lm(vertrouwen ~ sesKind + sesVolw + burgst + wrkls + geslacht + sesVolw:burgst, data = dataVertrouwen)


Om te weten hoe de categorische variabelen gecodeerd worden kan je de functie contrasts() gebruiken. Standaard gebruikt R dummy-codering. Uit de output kan je leren dat feitelijk gescheiden het referentieniveau is van de variabele burgst. Meer over coderen en referentieniveaus vind je hier vanaf deel 3.

contrasts(dataVertrouwen$burgst) # variabele burgst moet hiervoor van class 'factor' zijn!
                     getrouwd nooit getrouwd samenlevingscontract
feitelijk gescheiden        0              0                    0
getrouwd                    1              0                    0
nooit getrouwd              0              1                    0
samenlevingscontract        0              0                    1
weduwe/weduwnaar            0              0                    0
wettelijk gescheiden        0              0                    0
                     weduwe/weduwnaar wettelijk gescheiden
feitelijk gescheiden                0                    0
getrouwd                            0                    0
nooit getrouwd                      0                    0
samenlevingscontract                0                    0
weduwe/weduwnaar                    1                    0
wettelijk gescheiden                0                    1


Output van het model in R

Met de functie summary() kan je heel veel relevante informatie over het model oproepen. Als argument geef je gewoon het object modelInteractie.

summary(modelInteractie)

Call:
lm(formula = vertrouwen ~ sesKind + sesVolw + burgst + wrkls + 
    geslacht + sesVolw:burgst, data = dataVertrouwen)

Residuals:
    Min      1Q  Median      3Q     Max 
-5.8342 -1.5216 -0.0299  1.5545  6.8221 

Coefficients:
                                    Estimate Std. Error t value Pr(>|t|)  
(Intercept)                         0.369788   0.597570   0.619   0.5362  
sesKind                            -0.072537   0.034503  -2.102   0.0357 *
sesVolw                             0.237322   0.397933   0.596   0.5510  
burgstgetrouwd                     -0.369897   0.580524  -0.637   0.5241  
burgstnooit getrouwd               -0.487481   0.590067  -0.826   0.4089  
burgstsamenlevingscontract         -1.361041   0.625996  -2.174   0.0299 *
burgstweduwe/weduwnaar              0.116909   0.689249   0.170   0.8653  
burgstwettelijk gescheiden         -0.758917   0.621254  -1.222   0.2221  
wrklsNee                            0.122261   0.185057   0.661   0.5090  
geslachtVrouw                      -0.047136   0.125383  -0.376   0.7070  
sesVolw:burgstgetrouwd              0.059790   0.400746   0.149   0.8814  
sesVolw:burgstnooit getrouwd        0.142150   0.408257   0.348   0.7278  
sesVolw:burgstsamenlevingscontract  0.115478   0.426700   0.271   0.7867  
sesVolw:burgstweduwe/weduwnaar      0.004957   0.434946   0.011   0.9909  
sesVolw:burgstwettelijk gescheiden  0.291220   0.418969   0.695   0.4871  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 2.148 on 1202 degrees of freedom
Multiple R-squared:  0.08346,   Adjusted R-squared:  0.07279 
F-statistic: 7.818 on 14 and 1202 DF,  p-value: 4.586e-16

Deze output is interessant omdat je er de regressiecoëfficiënten in terugvindt, in de kolom Estimate. Daardoor kan je aflezen/berekenen wat het geschatte effect is van sesVolw op vertrouwen voor verschillende niveaus van burgst. Bijvoorbeeld:

  • Voor het referentieniveau van burgst: het effect van sesVolw is 0.2373221
  • Voor het niveau getrouwd van burgst: het effect van sesVolw is 0.2373221 \(+\) 0.0597898 \(=\) 0.2971119


De variabele burgst is een nominale variabele met 6 niveaus, waardoor in deze output 5 rijen te vinden zijn die iets met het interactie-effect te maken hebben. Er is in deze output dus niet 1 toets die je iets vertelt over het bestaan van het interactie-effect. Bijgevolg kan je uit deze output nog niet concluderen of er sprake is van een interactie-effect. Daarvoor zal je een afzonderlijke toets moeten uitvoeren: een modelvergelijkingstoets (zie verder).



4 Assumpties

Hypothesetoetsing met lineaire regressie is enkel een bruikbare en betrouwbare techniek als aan een reeks voorwaarden is voldaan. Die moet je verifiëren vooraleer je met de interpretatie mag beginnen.

De Gauss-Markovassumpties en de normaliteitsassumptie van de fouten kan je nagaan met plot(). Dit commando geeft je vier plots na elkaar. De eerste drie zijn relevant. In dit geval lijkt alles in orde en mag je verdergaan met de analyse.

Meer uitleg over de assumpties en deze plots vind je hier (vanaf 9.9).

plot(modelInteractie)


Merk op: zolang je enkel een toets uitvoert over het interactie-effect hoef je geen rekening te houden met mogelijke collineariteit met het interactie-effect. Zie over collineariteit in een lineair regressiemodel ook hier, de tweede alinea op p.65.



5 Hypothese over een interactie-effect

Je vraagt je af of het effect van sociaal-economische status op vertrouwen in andere mensen verschillend is naargelang iemands familiale situatie. Je vermoedt dus dat iemands burgerlijke staat (burgst) een effect heeft op het verband tussen sesVolw en vertrouwen.

Dit kan je onderzoeken met behulp van een modelvergelijking. Dat houdt in dat je een model met een interactie tussen sesVolw en burgst vergelijkt met een model dat die interactieterm niet bevat, maar voor de rest wel identiek is. Als blijkt dat het model met die interactie beter fit met de data, dan kan je concluderen dat die betere fit te wijten is aan de interactieterm.

We controleren ook voor nog andere predictoren. Dat doen we omdat de conclusie over het bestaan van het interactie-effect kan afhangen van de aanwezigheid van die extra predictoren in het model. De algemene regel is: neem elke predictor op waarvan je denkt dat die gerelateerd is aan de afhankelijke variabele en/of aan andere predictoren in het model.


Nulhypothese en alternatieve hypothese

De nulhypothese stelt dat er geen interactie is. Het effect van sesVolw op vertrouwen is dan hetzelfde, ongeacht de waarde van burgst. Als dat klopt, dan zullen we geen of nauwelijks betere predicties zien in het model mét interactieterm in vergelijking met het model zonder interactieterm.

De alternatieve hypothese stelt dat er wel interactie is, met andere woorden het effect van sesVolw op vertrouwen is verschillend in minstens één van de niveaus van burgst.


Significantieniveau

Net als bij elke hypothesetoets moet je een significantieniveau kiezen. Hier kiezen we voor de veelgebruikte waarde \(\alpha = 0.05\).


Modelvergelijking

Om te toetsen of burgst een effect heeft op het verband tussen sesVolw en vertrouwen voer je een modelvergelijking uit. Eerst specifieer je een tweede model modelZonderInteractie waarin de interactieterm burgst:sesVolw niet is opgenomen.

modelZonderInteractie <- lm(vertrouwen ~ sesKind + sesVolw + burgst + wrkls + geslacht, data = dataVertrouwen)


Nu kan je de functie anova() gebruiken. De output ervan zal je vertellen of het model met interactieterm burgst:sesVolw je in staat stelt om over het algemeen betere predicties te maken van vertrouwen dan het model zonder die interactieterm.

anova(modelZonderInteractie, modelInteractie)
Analysis of Variance Table

Model 1: vertrouwen ~ sesKind + sesVolw + burgst + wrkls + geslacht
Model 2: vertrouwen ~ sesKind + sesVolw + burgst + wrkls + geslacht + 
    sesVolw:burgst
  Res.Df    RSS Df Sum of Sq      F Pr(>F)
1   1207 5563.2                           
2   1202 5547.9  5    15.327 0.6642 0.6507


Conclusie

De conclusie kan je trekken door de p-waarde te vergelijken met het eerder gekozen significantieniveau \(\alpha\). De p-waarde vind je in de meest rechtse kolom genaamd Pr(>F).

In dit geval is 0.6507263 een pak groter dan 0.05. Je kan dus de nulhypothese niet verwerpen.



6 Visualiseren van interactie

Een interactie-effect kan je visualiseren. Daarbij toon je het effect van één predictor op de afhankelijke variabele, bij verschillende waarden van de andere predictor. Hiervoor heb je het R-package effects nodig.


install.packages('effects') # eenmalig het package installeren

library(effects) # bij de start van elke sessie moet je het package laden

plot(effect('sesVolw:burgst', modelInteractie),
     x.var='sesVolw', # plaatst deze variabele op de horizontale as van elk paneel
     axes=list(grid=TRUE) # optioneel     
     ) 


Uit de modelvergelijking bleek al dat er geen duidelijk interactie-effect speelde. Zie je dat ook terug in de plots?

Toon/verberg het antwoord

De helling van de rechte verschilt niet zoveel in de 6 plots. Het effect van sesVolw op vertrouwen is dus min of meer hetzelfde, ongeacht de waarde van burgst.



7 Predicties

Aan de hand van modelInteractie kan je predicties berekenen voor gelijk welke waarden van de predictoren. Die waarden zouden kunnen afkomstig zijn van een nieuw iemand, die bijvoorbeeld niet in de steekproef zat. Voor die nieuwe persoon krijg je een predictie van de waarde van vertrouwen.

nieuwPersoon <- data.frame(sesKind=mean(dataVertrouwen$sesKind),
                       sesVolw=mean(dataVertrouwen$sesVolw),
                       burgst='feitelijk gescheiden', 
                       wrkls='Ja', 
                       geslacht='Man')

predict(modelInteractie, nieuwPersoon)
       1 
0.369788 


Meer uitleg over de precieze berekening van predicties vind je hier vanaf 1.(a).



8 Voetnoten

  1. Meer bepaald zal je je moeten bewust zijn van:

    • het gebruikte coderingsschema: dummy- of effectcodering
    • het type toets dat wordt gehanteerd: type I, II of III
    • het feit dat er mogelijk problemen van collineariteit kunnen zijn


    Meer uitleg vind je hier vanaf 5.3.



9 Referenties

Mell H., Safra L., Demange P., Algan Y., Baumard N. & Chevallier C. (2021). Early life adversity is associated with diminished social trust in adults. Political Psychology. doi: 10.1111/pops.12756